package gfdclient;
import java.util.Vector;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * Класс осуществляющий загрузку, сохранение и изменение файла настроек.
 * @author Truewar Ashman (<a href="mailto:truewar@hotmail.ru">truewar@hotmail.ru</a>) ID = 2009
 */

public class Settings
{
	/**
	 * Класс для логической связи данных из файла.
	 * @author Truewar Ashman (<a href="mailto:truewar@hotmail.ru">truewar@hotmail.ru</a>) ID = 2009
	 */
	public class Field
	{
		/** Названия поля */
		String fieldName;
		/** Данные, связанные с полем */
		String fieldData;

		/**
		 * КОнструктор класса.
		 * @param fieldName имя поля.
		 * @param fieldData срока данных поля.
		 */
		public Field(String fieldName, String fieldData)
		{
			this.fieldName = fieldName;
			this.fieldData = fieldData;
		}
	}

	/** Путь к файлу настроек. */
	public String fileName;
	/** Набор строк из файла. */
	private Vector <Field> settings;

	/**
	 * Конструктор по-умолчанию.
	 * Осуществляет инициализацию переменных по-умолчанию.
	 * Файл настроек - settings.ini
	 */
	Settings()
	{
		fileName = "settings.ini";
		settings = new Vector <Field>();

	}

	/**
	 * Конструктор.
	 * @param settingsFileName путь к файлу с настройками.
	 */
	Settings(String settingsFileName)
	{
		fileName = settingsFileName;
		settings = new Vector <Field>();

	}

	/**
	 * Чтение данных из файла и представление их с помощью класса Field
	 * @see Field
	 */
	public void loadFile()
	{
		try
		{
			BufferedReader in = new BufferedReader(new FileReader(fileName));
			try
			{
				while(in.ready() == true)
				{
					String tmp = in.readLine();

					if((tmp.length() == 0) || (tmp.charAt(0) == '#'))
					{// Проверка на пустую строку и комментарий.

						settings.add(new Field("\0", tmp));
					} else
					{
						String t[] = tmp.split("=", 2);
						if(t.length < 2)
						{
							System.out.println(	"Settings file " +
												"format error in line: \"" +
												tmp + "\"");
							return;
						}
						settings.add(new Field(t[0], t[1]));
					}
				}
				in.close();
			} catch (IOException e)
				{System.out.println("Couldn`t read file " + fileName);}
		} catch(FileNotFoundException e)
			{System.out.println(fileName + " wasn`t found");}
	}

	/**
	 * Сохранение данных в файл.
	 * @see Field
	 */
	public void saveFile()
	{
		try
		{
			BufferedWriter out = new BufferedWriter(new FileWriter(fileName));
				int i = 0;
				while(i < settings.size())
				{
					if(settings.get(i).fieldName.compareTo("\0") == 0)
						out.write(settings.get(i).fieldData);
					else
						out.write(	settings.get(i).fieldName + "=" +
									settings.get(i).fieldData);

					out.newLine();
					i++;
				}
				out.close();
		} catch(FileNotFoundException e)
			{System.out.println(fileName + " wasn`t found");}
		  catch(IOException e)
			{System.out.println("Couldn`t read file " + fileName);}
	}

	/**
	 * Получение данных из поля с именем fieldName
	 * @param fieldName имя поля.
	 * @return данные из поля с именем fieldName
	 * @throws java.lang.Exception в случае, если поле с именем fieldName
	 * не найдено
	 */
	public String getField(String fieldName) throws Exception
	{
		int i = 0;
		while(i < settings.size())
		{
			if(settings.get(i).fieldName.compareTo(fieldName) == 0)
				return settings.get(i).fieldData;
			i++;
		}
		throw new Exception("No field with name \"" + fieldName + "\"");
	}

	/**
	 * Перезапись данных в поле с именем fieldName
	 * @param fieldName имя поля.
	 * @param data новое значение поля.
	 * @throws java.lang.Exception в случае, если поле с именем fieldName
	 * не найдено
	 */
	public void setField(String fieldName, String data) throws Exception
	{
		int i = 0;
		while(i < settings.size())
		{
			if(settings.get(i).fieldName.compareTo(fieldName) == 0)
			{
				settings.get(i).fieldData = data;
				return;
			}
			i++;
		}
		throw new Exception("No field with name \"" + fieldName + "\"");
	}

	/**
	 * Добавление нового поля или редактирование старого.<br>
	 * Если в файле настроек уже есть поле с именем fieldName, то вызывается
	 * метод setField с соответствующими параметрами для изменения старого
	 * значения. Иначе просто добавляется новое поле с указанным именем.
	 * @param fieldName имя поля
	 * @param data новые данные
	 * @see #setField(java.lang.String, java.lang.String)
	 */
	public void addField(String fieldName, String data)
	{
		try
		{
			getField(fieldName);
			setField(fieldName, data);
		} catch(Exception ex)
		{
			settings.add(new Field(fieldName, data));
		}
	}
}
















